home *** CD-ROM | disk | FTP | other *** search
/ ftp.hitl.washington.edu / ftp.hitl.washington.edu.tar / ftp.hitl.washington.edu / pub / people / tsoper / CT Explorer / Scan.cs < prev    next >
Text File  |  2005-05-30  |  4KB  |  165 lines

  1. using System;
  2. using System.Windows.Forms;
  3. using System.IO;
  4. using  System.ComponentModel;
  5. using SampleGUI;
  6.  
  7.  
  8. public class Scan
  9. {
  10.     //Data Attributes
  11.     public string FilePath;
  12.     public ushort[,,] Data;
  13.     public int NumberDimensions;
  14.     public int[] DimensionSize;
  15.     public string DataType;
  16.     public float[] ElementSpacing;
  17.     public int Window;
  18.     public int Level;
  19.  
  20.     //Index of where to display the scan 
  21.     public int[] SliceIndex;
  22.  
  23.     public Scan()
  24.     {
  25.         SliceIndex = new int[3];
  26.         Window = 700;
  27.         Level = 350;
  28.     }
  29.  
  30.     public int Read()
  31.     {
  32.         string fileType = FilePath.Substring(FilePath.Length-3,3);
  33.         fileType = fileType.ToLower();
  34.  
  35.         switch( fileType )
  36.         {
  37.             case "mhd":
  38.                 return ReadInMhd();
  39.             default:
  40.                 MessageBox.Show("Unknown file type","Error");
  41.                 return -1;
  42.         }
  43.     }
  44.  
  45.     private int ReadInMhd()
  46.     {
  47.         FileStream file = new FileStream(FilePath,FileMode.Open,
  48.                                 FileAccess.Read);
  49.         StreamReader sr = new StreamReader(file);
  50.         
  51.         while(sr.Peek() > 0)
  52.         {
  53.             string lineStr = sr.ReadLine();
  54.             int equalSignIdx = lineStr.IndexOf("=",0);
  55.             string elementLStr = lineStr.Substring(0,equalSignIdx);
  56.             string elementRStr = lineStr.Substring(equalSignIdx + 1,
  57.                 lineStr.Length - equalSignIdx - 1); 
  58.             elementRStr = elementRStr.Trim();
  59.  
  60.  
  61.             switch(elementLStr.Trim().ToLower())
  62.             {
  63.                 case "objecttype":
  64.                     if(!elementRStr.Trim().ToLower().Equals("image"))
  65.                     {
  66.                         MessageBox.Show("Object must be an image","Error");
  67.                         return -1;
  68.                     }
  69.                     break;
  70.                 case "ndims":
  71.                     NumberDimensions = Convert.ToInt32(
  72.                                             elementRStr);
  73.                     DimensionSize = new int[NumberDimensions];
  74.                     ElementSpacing = new float[NumberDimensions];
  75.                     if(!NumberDimensions.Equals(3))
  76.                     {
  77.                         MessageBox.Show(
  78.                             "Image must contain 3 dimensions","Error");
  79.                         return -1;
  80.                     }
  81.                     break;
  82.                 case "dimsize":
  83.                     for(int ii = 0; ii < NumberDimensions; ii++)
  84.                     {
  85.                         string subStr;
  86.                         //parse dimnesion size text at white spaces
  87.                         if( ii < (NumberDimensions-1))
  88.                         {
  89.                             int spaceIdx = elementRStr.IndexOf(" ");
  90.                             subStr = elementRStr.Substring(
  91.                                             0,spaceIdx);
  92.                             elementRStr = elementRStr.Substring(
  93.                                             spaceIdx + 1);
  94.                         }
  95.                         else
  96.                             subStr = elementRStr;
  97.  
  98.                         DimensionSize[ii] = Convert.ToInt32(subStr);
  99.                     }
  100.                     break;
  101.                 case "elementtype":
  102.                     DataType = elementRStr;
  103.                     break;
  104.                 case "elementspacing":
  105.                     for(int ii = 0; ii < NumberDimensions; ii++)
  106.                     {
  107.                         string subStr;
  108.                         if( ii < (NumberDimensions-1))
  109.                         {
  110.                             int spaceIdx = elementRStr.IndexOf(" ");
  111.                             subStr = elementRStr.Substring(
  112.                                 0,spaceIdx);
  113.                             elementRStr = elementRStr.Substring(
  114.                                 spaceIdx + 1);
  115.                         }
  116.                         else
  117.                             subStr = elementRStr;
  118.  
  119.                         ElementSpacing[ii] = Convert.ToSingle(subStr);
  120.                     }
  121.                     break;
  122.                 case "elementdatafile":
  123.                     FilePath = elementRStr;
  124.                     if(!File.Exists(FilePath))
  125.                     {
  126.                         MessageBox.Show(
  127.                             "Cannot find source data file");
  128.                         return -1;
  129.                     }
  130.                     break;
  131.                 default:
  132.                     break;
  133.             }//switch
  134.         } //while
  135.         Data = new ushort[DimensionSize[0],DimensionSize[1],
  136.                             DimensionSize[2]];
  137.         sr.Close();
  138.         file.Close();
  139.         return ReadInRaw();
  140.     }//ReadInMhd
  141.  
  142.     private int ReadInRaw()
  143.     {
  144.         FileStream file = new FileStream(FilePath,FileMode.Open,
  145.                                         FileAccess.Read);
  146.         BinaryReader br = new BinaryReader(file);
  147.  
  148.         //don't know how to read in any other way than this
  149.         for(int iii = 0; iii < DimensionSize[2]; iii++)
  150.         {
  151.             for(int ii = 0; ii < DimensionSize[1]; ii++)
  152.             {
  153.                 for(int i = 0; i < DimensionSize[0]; i++)
  154.                 {
  155.                     Data[i,ii,iii] = br.ReadUInt16();
  156.                 }//for
  157.             }//for
  158.         }//for
  159.  
  160.         return 0;
  161.     }//ReadInRaw
  162.     
  163.  
  164. }
  165.